#ifndef CHANNEL
#define CHANNEL

#include "Common.h"
// #include "EventLoop.h"
#include <functional>
#include <sys/epoll.h>

class Poller;
class EventLoop;
class Channel
{
    using EventCallBack = std::function<void()>;

public:
    Channel(EventLoop *loop, int fd);
    int getFd();
    uint32_t getEvents();
    void setRevents(uint32_t revents);
    // 判断是否监控了可写/读
    bool ReadAble();
    bool WriteAble();
    // 启动读写事件监控
    void EnableRead();
    void EnableWrite();
    void DisableRead();
    void DisableWrite();
    void DisableAll();
    // 移除对fd的监控，从epoll的红黑树结构移除
    void Remove();
    void Update();

    void SetReadCallBack(const EventCallBack &rcb);
    void SetWriteCallBack(const EventCallBack &wcb);
    void SetErrorCallBack(const EventCallBack &ecb);
    void SetCloseCallBack(const EventCallBack &ccb);
    void SetRandomCallBack(const EventCallBack &rdmcb);

    void HandleEvent();

private:
    void safeCall(const std::function<void()> &cb);

private:
    int _fd = DefaultFD;
    EventLoop *_loop;
    uint32_t _events;               // 关心的事件
    uint32_t _revents;              // 返回的关心事件
    EventCallBack _read_callback;   // 可读事件回调
    EventCallBack _write_callback;  // 可写事件回调
    EventCallBack _error_callback;  // 错误事件回调
    EventCallBack _close_callback;  // 连接断开事件触发的回调函数
    EventCallBack _random_callback; // 任意事件触发的回调函数
};

#endif
